home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok11
/
r.o.m.
/
m2sources
/
calcu.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
26KB
|
836 lines
IMPLEMENTATION MODULE Calcu;
(*
Created: 02/88
Changed: 08.02.88/03.03.88/25.7.88/5.8.88/11.9.88/21.9.88 by
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft version from 5.5.88
*)
FROM ASCII IMPORT nul,lf,cr;
FROM Arts IMPORT Assert,Error,TermProcedure;
FROM SYSTEM IMPORT ADR,ADDRESS;
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
IMPORT FileSystem;
FROM FileMessage IMPORT StrPtr,ResponseText;
FROM DOS IMPORT Open,Close,Write,newFile,FileHandlePtr;
FROM Conversions IMPORT StrToVal,ValToStr;
FROM MyMathLibLong IMPORT sqrt,unit,AngleUnit;
FROM MyRemember IMPORT RememberNodePtr;
FROM MakeMenu IMPORT MenuRecord,InitMenu,FreeMenu,MenuNum,ItemNum,SubNum;
FROM StringInOut IMPORT OpenNewWindow,CloseNewWindow,ReadString,WriteString,
SetClear,GetKey,inputOK,Flags,FlagSet;
FROM Formelauswertung IMPORT DefFormel,LongBerechnung,AssignLong,ClearVar,
GetLongValue;
FROM MyStrings IMPORT Assign,Length;
FROM FormelausFText IMPORT GetFehlertext;
FROM MyLongRealConversions IMPORT RealToStr,fillChar;
FROM Exec IMPORT WaitPort,GetMsg,ReplyMsg;
FROM Intuition IMPORT WindowPtr,IntuiMessagePtr,IDCMPFlags,IDCMPFlagSet,
ModifyIDCMP,SetMenuStrip,MenuPtr,MenuItemPtr,menuNull,ItemAddress,
GetPrefs,PreferencesPtr,ClearMenuStrip;
CONST
MaxLongReal=MAX(LONGREAL);
TYPE
FString=ARRAY[0..250] OF CHAR;
Out=(s,p,d);
SPDSet=SET OF Out;
VAR
wP:WindowPtr;
fileOpen:BOOLEAN;
textFile:FileSystem.File;
rememberKey:RememberNodePtr;
mDefiniert:BOOLEAN;
oldm:LONGREAL;
PROCEDURE CleanupTas;
BEGIN
IF wP#NIL THEN
ClearMenuStrip(wP);
CloseNewWindow(wP);
wP:=NIL;
IF NOT mDefiniert THEN
IF oldm= MaxLongReal THEN
ClearVar('m')
ELSE
IF AssignLong('m',oldm) THEN END
END
END;
END;
IF fileOpen THEN
FileSystem.Close(textFile);
fileOpen:=FALSE;
END;
IF rememberKey#NIL THEN
FreeMenu(rememberKey);
rememberKey:=NIL
END;
END CleanupTas;
PROCEDURE Tas;
CONST
MaxStellen=14;
VAR
tasMenu:ARRAY[0..3] OF MenuRecord;
firstMenu:MenuPtr;
ergebnis:LONGREAL;
myPref:RECORD
leftMargin:INTEGER;
rightMargin:INTEGER;
END;
outputSet:SPDSet;
fileName:ARRAY[0..32] OF CHAR;
expoSet,formelAnwenden:BOOLEAN;
datenzahl:CARDINAL;
outStellen:INTEGER;
summe,qSumme,mittelwert,standart,grundgesamt:LONGREAL;
ende,canDelete:BOOLEAN;
formel,alteFormel:FString;
prSpace:CHAR;
formelChar:CHAR;
printerSpace:ARRAY [0..255] OF CHAR;
oldFormel:BOOLEAN;
newBase,oldBase:[2..16];
allFix:BOOLEAN;
printOnlyResult:BOOLEAN;
fehler:CARDINAL;
PROCEDURE Init;
VAR
prefPtr:PreferencesPtr;
i:[0..255];
BEGIN
ALLOCATE(prefPtr,SIZE(prefPtr^));
GetPrefs(prefPtr,SIZE(prefPtr^));
(*myPref.paperLength:=prefPtr^.paperType;*)
myPref.leftMargin:=prefPtr^.printRightMargin;
myPref.rightMargin:=prefPtr^.printImage;
(* eigenwillige Preference-Bezeichnungen !!!!Compilerfehler!!!!!!!!!!!*)
DEALLOCATE(prefPtr,SIZE(prefPtr^));
prSpace:=' ';
FOR i:=0 TO 254 DO
printerSpace[i]:=prSpace;
END;
printerSpace[255]:=0C;
outputSet:=SPDSet{s};
fileName:='RechnerProtokoll';
fileOpen:=FALSE;
formel[0]:=0C;
alteFormel[0]:=0C;
fehler:=0;
ende:=FALSE;
oldFormel:=FALSE;
datenzahl:=0;
canDelete:=FALSE;
summe:=0.0;
qSumme:=0.0;
standart:=0.0;
grundgesamt:=0.0;
outStellen:=MaxStellen;
allFix:=TRUE;
oldBase:=16;
newBase:=16;
expoSet:=FALSE;
formelAnwenden:=FALSE;
mDefiniert:=FALSE;
unit:=rad;
printOnlyResult:=FALSE;
END Init;
(*************************************************************************)
PROCEDURE InitTasMenu():BOOLEAN;
VAR i,j:CARDINAL;
BEGIN
WITH tasMenu[0] DO
mname:='Aktionen';
anzahlItems:=4;
WITH mItems[0] DO
iname:='Letzte Formel';
commandKey:='F';
anzahlSubitems:=0;
END;
WITH mItems[1] DO
iname:='Wert speichern';
commandKey:='S';
anzahlSubitems:=0;
END;
WITH mItems[2] DO
iname:='Füllzeichen setzen';
commandKey:='.';
anzahlSubitems:=0;
END;
WITH mItems[3] DO
iname:='Ins Hauptmenü';
commandKey:='E';
anzahlSubitems:=0;
END;
END;
WITH tasMenu[1] DO
mname:='Parameter';
anzahlItems:=8;
WITH mItems[0] DO
iname:='Drucker';
anzahlSubitems:=2;
subrecords[0].subName:='Aus';
subrecords[0].commandKey:='A';
subrecords[1].subName:='Ein';
subrecords[1].commandKey:='P';
END;
WITH mItems[1] DO
iname:='Druckerausgabe';
anzahlSubitems:=2;
subrecords[0].subName:='2+3=5';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='=5';
subrecords[1].commandKey:=0C;
END;
WITH mItems[2] DO
iname:='Disk-Protokoll';
anzahlSubitems:=2;
subrecords[0].subName:='Nein';
subrecords[0].commandKey:='N';
subrecords[1].subName:='Ja';
subrecords[1].commandKey:='J';
END;
WITH mItems[3] DO
iname:='Exponent';
anzahlSubitems:=2;
subrecords[0].subName:='Nein';
subrecords[0].commandKey:='[';
subrecords[1].subName:='Ja';
subrecords[1].commandKey:=']';
END;
WITH mItems[4] DO
iname:='Winkeleinheit';
anzahlSubitems:=3;
subrecords[0].subName:='Rad';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='Deg';
subrecords[1].commandKey:=0C;
subrecords[2].subName:='Gon';
subrecords[2].commandKey:=0C;
END;
WITH mItems[5] DO
iname:='Formel anwenden';
anzahlSubitems:=2;
subrecords[0].subName:='Nein';
subrecords[0].commandKey:='z';
subrecords[1].subName:='Ja';
subrecords[1].commandKey:='y';
END;
WITH mItems[6] DO
iname:='Stellenbeschränkung';
anzahlSubitems:=2;
subrecords[0].subName:='Gesamt';
subrecords[0].commandKey:='G';
subrecords[1].subName:='Komma';
subrecords[1].commandKey:='K';
END;
WITH mItems[7] DO
iname:='Stellen';
anzahlSubitems:=12;
subrecords[0].subName:='14';
subrecords[0].commandKey:='\';
subrecords[1].subName:='12';
subrecords[1].commandKey:='-';
subrecords[2].subName:='10';
subrecords[2].commandKey:='9';
subrecords[3].subName:='8';
subrecords[3].commandKey:='8';
subrecords[4].subName:='7';
subrecords[4].commandKey:='7';
subrecords[5].subName:='6';
subrecords[5].commandKey:='6';
subrecords[6].subName:='5';
subrecords[6].commandKey:='5';
subrecords[7].subName:='4';
subrecords[7].commandKey:='4';
subrecords[8].subName:='3';
subrecords[8].commandKey:='3';
subrecords[9].subName:='2';
subrecords[9].commandKey:='2';
subrecords[10].subName:='1';
subrecords[10].commandKey:='1';
subrecords[11].subName:='0';
subrecords[11].commandKey:='0';
END;
END;
WITH tasMenu[2] DO
mname:='Umwandlung';
anzahlItems:=3;
WITH mItems[0] DO
iname:='Convert';
commandKey:='C';
anzahlSubitems:=0;
END;
FOR j:= 1 TO 2 DO
WITH mItems[j] DO
anzahlSubitems:=12;
FOR i:= 0 TO 11 DO
subrecords[i].commandKey:=0C
END;
subrecords[0].subName:='16';
subrecords[1].subName:='14';
subrecords[2].subName:='12';
subrecords[3].subName:='10';
subrecords[4].subName:='9';
subrecords[5].subName:='8';
subrecords[6].subName:='7';
subrecords[7].subName:='6';
subrecords[8].subName:='5';
subrecords[9].subName:='4';
subrecords[10].subName:='3';
subrecords[11].subName:='2';
END;
END;
mItems[1].iname:='Alte Basis';
mItems[2].iname:='Neue Basis';
END;
WITH tasMenu[3] DO
mname:='Statistik';
anzahlItems:=8;
WITH mItems[0] DO
iname:='Datenzahl';
commandKey:='i';
anzahlSubitems:=0;
END;
WITH mItems[1] DO
iname:='Summe der Eingaben';
commandKey:='=';
anzahlSubitems:=0;
END;
WITH mItems[2] DO
iname:='Summe der Quadrate';
commandKey:='U';
anzahlSubitems:=0;
END;
WITH mItems[3] DO
iname:='Standardabweichung';
commandKey:='T';
anzahlSubitems:=0;
END;
WITH mItems[4] DO
iname:='Grundgesamtheitsabw.';
commandKey:='V';
anzahlSubitems:=0;
END;
WITH mItems[5] DO
iname:='Mittelwert';
commandKey:='M';
anzahlSubitems:=0;
END;
WITH mItems[6] DO
iname:='Wert löschen';
commandKey:='D';
anzahlSubitems:=0;
END;
WITH mItems[7] DO
iname:='Reset';
commandKey:='R';
anzahlSubitems:=0;
END;
END;
InitMenu(tasMenu,firstMenu,rememberKey);
RETURN SetMenuStrip(wP,firstMenu);
END InitTasMenu;
PROCEDURE WriteStr(str:ARRAY OF CHAR;to:SPDSet;newLine:BOOLEAN);
VAR
file:FileHandlePtr;
actuelLength:LONGINT;
cr:ARRAY [0..1] OF CHAR;
i:INTEGER;
BEGIN
IF s IN to THEN
WriteString(wP,str,newLine)
END;
IF p IN to THEN
cr[0]:=33C;
cr[1]:='E';
file:=Open(ADR('PRT:'),newFile);
IF file#NIL THEN
actuelLength:=Write(file,ADR(str),LONGINT(Length(str)));
IF newLine THEN
actuelLength:=Write(file,ADR(cr),2)
END;
Close(file)
END;
END;
IF d IN to THEN
FOR i:=0 TO INTEGER(Length(str))-1 DO
FileSystem.WriteChar(textFile,str[i])
END;
IF newLine THEN
FileSystem.WriteChar(textFile,lf)
END
END
END WriteStr;
PROCEDURE WriteLong(x:LONGREAL;to:SPDSet);
VAR
str:ARRAY [0..22] OF CHAR;
expo,linksbuendig:[-1..1];
BEGIN
IF prSpace=nul THEN (* Zahl linksbuendig formatieren *)
linksbuendig:=-1
ELSE
linksbuendig:=1
END;
IF ((ABS(x) < 1.0) AND allFix) OR expoSet THEN
expo:=-1;
ELSE
expo:=1;
END;
IF allFix THEN
RealToStr(x,str,outStellen*linksbuendig,(MaxStellen-1)*expo)
ELSE
RealToStr(x,str,MaxStellen*linksbuendig,outStellen*expo)
END;
IF (allFix AND (outStellen < 2)) THEN
WriteStr('Gesamtstellen zu klein',SPDSet{s},TRUE)
ELSE
WriteStr('=',to,FALSE);
WriteStr(str,to,TRUE)
END;
END WriteLong;
PROCEDURE RespondMessage;
VAR
msgPtr:IntuiMessagePtr;
class:IDCMPFlagSet;
code:CARDINAL;
menuNr,itemNr,subNr:CARDINAL;
ok:BOOLEAN;
string:ARRAY[0..22] OF CHAR;
fehlertext:ARRAY[0..81] OF CHAR;
PROCEDURE Rechnen;
VAR
onlyFFP:BOOLEAN;
i:CARDINAL;
z:LONGREAL;
pos:INTEGER;
backup:FString;
BEGIN
IF formel[0]# 0C THEN
backup:=formel;
i:=0;
WHILE backup[i]#0C DO
IF (backup[i]='[') OR (backup[i]='{') THEN
backup[i]:='('
ELSIF (backup[i]=']') OR (backup[i]='}') THEN
backup[i]:=')'
END;
INC(i);
END;
fehler:=DefFormel(3,backup,TRUE,onlyFFP);
IF fehler#0 THEN
GetFehlertext(fehler,fehlertext);
WriteStr(fehlertext,SPDSet{s},TRUE);
ELSE
LongBerechnung(3,ergebnis,fehler);
IF formelAnwenden AND (fehler=0) THEN
IF AssignLong(formelChar,ergebnis) THEN END;
LongBerechnung(4,ergebnis,fehler)
END;
IF fehler = 0 THEN
IF AssignLong('m',ergebnis) THEN END;
summe:=summe+ergebnis;
IF (ergebnis< 1.0E154) AND (qSumme#MaxLongReal) THEN
qSumme:=qSumme+(ergebnis*ergebnis)
ELSE
qSumme:=MaxLongReal
END;
INC(datenzahl);
canDelete:=TRUE;
IF NOT printOnlyResult THEN
WriteStr(formel,outputSet-SPDSet{s},FALSE);
pos:=myPref.rightMargin-myPref.leftMargin-INTEGER(Length(formel));
IF pos >= (outStellen+8) THEN
pos:=pos-(outStellen+8);
printerSpace[pos]:=0C;
WriteStr(printerSpace,outputSet-SPDSet{s},FALSE);
printerSpace[pos]:=prSpace;
ELSE
WriteStr('',outputSet-SPDSet{s},TRUE)
END
END;
WriteLong(ergebnis,outputSet);
ELSE
canDelete:=FALSE;
GetFehlertext(fehler,fehlertext);
WriteStr(fehlertext,SPDSet{s},TRUE)
END;
END;
ELSE
WriteStr('',SPDSet{s},TRUE);
END;
END Rechnen;
PROCEDURE MenuReaction;
VAR
menuNr,itemNr,subNr:CARDINAL;
menuIPtr:MenuItemPtr;
PROCEDURE Convert;
VAR er,signed:BOOLEAN;
zahl:LONGINT;
str:ARRAY[0..30] OF CHAR;
BEGIN
signed:=TRUE;
IF formel[0]#0C THEN
StrToVal(formel,zahl,signed,oldBase,er);
IF NOT er THEN
ValToStr(zahl,TRUE,str,newBase,-SIZE(str),' ',er)
END
END;
IF er THEN
WriteStr('Convertierung nicht möglich',SPDSet{s},TRUE)
ELSE
WriteStr(formel,outputSet-SPDSet{s},FALSE);
WriteStr(' convertiert zu ',outputSet,FALSE);
WriteStr(str,outputSet,TRUE)
END
END Convert;
PROCEDURE LastFormel;
BEGIN
oldFormel:=TRUE;
END LastFormel;
PROCEDURE Store;
VAR c:ARRAY[0..0] OF CHAR;
BEGIN
WriteStr('Variable:',SPDSet{s},TRUE);
c[0]:=GetKey(wP);
IF inputOK AND AssignLong(c[0],ergebnis) THEN
mDefiniert:=mDefiniert OR (c[0]='m');
WriteStr(c,outputSet,FALSE);
WriteStr(' :',outputSet,FALSE);
WriteLong(ergebnis,outputSet)
END;
inputOK:=FALSE (*damit alte Formel nicht geloescht wird*)
END Store;
PROCEDURE SetFillChar;
VAR i:[0..255];
str:ARRAY[0..4] OF CHAR;
c:CHAR;
BEGIN
WriteStr('Füllzeichen:',SPDSet{s},FALSE);
c:=GetKey(wP);
IF inputOK AND (c # nul) THEN
IF c= cr THEN
prSpace:= nul;
fillChar:=' ';
str:='NULL';
WriteStr(str,SPDSet{s},FALSE);
ELSE
prSpace:=c;
fillChar:=c;
str[0]:=c;
str[1]:=0C;
WriteStr(str,SPDSet{s},FALSE);
END;
FOR i:=0 TO 254 DO
printerSpace[i]:=prSpace;
END;
inputOK:=FALSE (*damit alte Formel nicht geloescht wird*)
END;
WriteStr('',SPDSet{s},TRUE);
END SetFillChar;
PROCEDURE FormelAnwenden(f:BOOLEAN);
VAR
onlyFFP:BOOLEAN;
c:ARRAY[0..1] OF CHAR;
text:ARRAY[0..40] OF CHAR;
fehler:CARDINAL;
formel:FString;
BEGIN
IF f THEN
WriteStr('Variable der Formel:',SPDSet{s},FALSE);
c[0]:=GetKey(wP);
IF (c[0]#0C) AND inputOK THEN
c[1]:=0C;
WriteStr(c,SPDSet{s},TRUE);
formelChar:=c[0];
IF AssignLong(formelChar,ergebnis) THEN
formel[0]:=0C;
REPEAT
ReadString(wP,'Anzuwendende Formel:',formel,20);
IF inputOK AND (formel[0] # 0C) THEN
fehler:=DefFormel(4,formel,TRUE,onlyFFP);
END;
IF fehler#0 THEN
GetFehlertext(fehler,text);
WriteStr(text,SPDSet{s},TRUE);
END;
UNTIL (formel[0]=0C) OR (fehler=0) OR NOT inputOK;
IF fehler = 0 THEN
formelAnwenden:=TRUE;
WriteStr('Anwenden:',outputSet,FALSE);
WriteStr(formel,outputSet,TRUE)
END
END
END;
inputOK:=FALSE (*damit alte Formel nicht geloescht wird*)
ELSE
formelAnwenden:=FALSE;
WriteStr('Formel anwenden aus',outputSet,TRUE)
END
END FormelAnwenden;
PROCEDURE Delete;
BEGIN
IF canDelete THEN
summe:=summe-ergebnis;
qSumme:=qSumme-(ergebnis*ergebnis);
DEC(datenzahl);
canDelete:=FALSE;
WriteStr('Letzter Wert gelöscht',outputSet,TRUE);
ELSE
WriteStr('Kann letztes Datum nich löschen',SPDSet{s},TRUE)
END;
END Delete;
PROCEDURE Main;
BEGIN
ende:=TRUE;
WriteStr('Ende',outputSet-SPDSet{s},TRUE);
END Main;
PROCEDURE DiskOn(on:BOOLEAN);
VAR p:StrPtr;
pathOK:BOOLEAN;
f:FileSystem.File;
BEGIN
IF on THEN
REPEAT
ReadString(wP,'Pfad:',fileName,30);
IF inputOK AND (fileName[0]#0C) THEN
FileSystem.Lookup(f,fileName,0,TRUE);
(* nur pruefen ob fileName ein gueltiger Dos-Pfad
danach testfile f wieder schliessen
*)
IF f.res = FileSystem.done THEN
FileSystem.Close(f);
IF fileOpen THEN
(* altes File Schliessen *)
FileSystem.Close(textFile);
END;
FileSystem.Lookup(textFile,fileName,512,TRUE);
Assert(textFile.res=FileSystem.done,ADR('Cannot Open File'));
fileOpen:=TRUE;
pathOK:=TRUE;
outputSet:=outputSet+SPDSet{d};
WriteStr('Disk-Protokoll an',outputSet,TRUE)
ELSE
pathOK:=FALSE;
ResponseText(f.res,p);
WriteStr(p^,SPDSet{s},TRUE)
END
END
UNTIL (fileName[0]=0C) OR pathOK OR NOT inputOK;
inputOK:=FALSE (*damit alte Formel nicht geloescht wird*)
ELSE
outputSet:=outputSet-SPDSet{d};
WriteStr('Disk-Protokoll ende',outputSet,TRUE);
IF fileOpen THEN
FileSystem.Close(textFile);
fileOpen:=FALSE
END
END
END DiskOn;
PROCEDURE Datenzahl;
BEGIN
WriteStr('Datenzahl ',outputSet,FALSE);
WriteLong(LONGREAL(datenzahl),outputSet);
END Datenzahl;
PROCEDURE Summe;
BEGIN
WriteStr('Summe der Daten ',outputSet,FALSE);
WriteLong(summe,outputSet);
END Summe;
PROCEDURE QSumme;
BEGIN
WriteStr('Quadratsumme ',outputSet,FALSE);
WriteLong(qSumme,outputSet)
END QSumme;
PROCEDURE Standard;
BEGIN
IF (datenzahl > 1) AND (qSumme<MaxLongReal) THEN
standart:=qSumme-((summe*summe)/LONGREAL(datenzahl));
standart:=standart/LONGREAL(datenzahl-1);
standart:=sqrt(standart);
WriteStr('Standardabweichung',outputSet,FALSE);
WriteLong(standart,outputSet)
ELSE
WriteStr('Datenzahl zu klein',SPDSet{s},TRUE)
END;
END Standard;
PROCEDURE Grundgesamtheit;
BEGIN
IF (datenzahl>1) AND (qSumme<MaxLongReal) THEN
grundgesamt:=qSumme-((summe*summe)/LONGREAL(datenzahl));
grundgesamt:=grundgesamt/LONGREAL(datenzahl);
grundgesamt:=sqrt(grundgesamt);
WriteStr('Grundgesamtheits. ',outputSet,FALSE);
WriteLong(grundgesamt,outputSet)
ELSE
WriteStr('Datenzahl zu klein',SPDSet{s},TRUE)
END;
END Grundgesamtheit;
PROCEDURE Mittelwert;
BEGIN
IF datenzahl > 0 THEN
mittelwert:=summe/LONGREAL(datenzahl);
WriteStr('Arithm. Mittelwert',outputSet,FALSE);
WriteLong(mittelwert,outputSet)
ELSE
WriteStr('Keine Daten für Mittelwert',SPDSet{s},TRUE)
END
END Mittelwert;
PROCEDURE Reset;
BEGIN
summe:=0.0;
qSumme:=0.0;
standart:=0.0;
grundgesamt:=0.0;
datenzahl:=0;
mittelwert:=0.0;
canDelete:=FALSE;
WriteStr('Reset Statistik',outputSet,TRUE)
END Reset;
BEGIN (*MenuReaction*)
IF class=IDCMPFlagSet{menuPick} THEN
WHILE code#menuNull DO
menuNr:=MenuNum(code);
itemNr:=ItemNum(code);
subNr:=SubNum(code);
CASE menuNr OF
0:CASE itemNr OF
0:LastFormel|
1:Store|
2:SetFillChar|
3:Main
END|
1:CASE itemNr OF
0:CASE subNr OF
0:outputSet:=outputSet-SPDSet{p}|
1:outputSet:=outputSet+SPDSet{p}|
END|
1:CASE subNr OF
0:printOnlyResult:=FALSE|
1:printOnlyResult:=TRUE|
END|
2:CASE subNr OF
0:DiskOn(FALSE)|
1:DiskOn(TRUE)|
END|
3:expoSet:=(subNr=1)|
(*CASE subNr OF
0:expoSet:=FALSE|
1:expoSet:=TRUE
END|
*)
4:CASE subNr OF
0:unit:=rad|
1:unit:=deg|
2:unit:=gon|
END|
5:CASE subNr OF
0:FormelAnwenden(FALSE)|
1:FormelAnwenden(TRUE)|
END|
6:allFix:=(subNr=0)|
(*CASE subNr OF
0:allFix:=TRUE|
1:allFix:=FALSE|
END|
*)
7:CASE subNr OF
0:outStellen:=14|
1:outStellen:=12|
2:outStellen:=10|
3..11:outStellen:=11-subNr|
END|
END|
2:CASE itemNr OF
0:Convert|
1:CASE subNr OF
0:oldBase:=16|
1:oldBase:=14|
2:oldBase:=12|
3..11:oldBase:=13-subNr|
END|
2:CASE subNr OF
0:newBase:=16|
1:newBase:=14|
2:newBase:=12|
3..11:newBase:=13-subNr|
END|
END|
3:CASE itemNr OF
0:Datenzahl|
1:Summe|
2:QSumme|
3:Standard|
4:Grundgesamtheit|
5:Mittelwert|
6:Delete|
7:Reset|
END|
END;
menuIPtr:=ItemAddress(firstMenu,code);
code:=menuIPtr^.nextSelect;
END;
ELSIF class=IDCMPFlagSet{closeWindow} THEN
Main
ELSE
Error(ADR('MenuReaktion'),ADR('unknownMenuMsg'))
END;
END MenuReaction;
BEGIN
(*WaitPort(wP^.userPort); das uebernimmt ReadString *)
msgPtr:=GetMsg(wP^.userPort);
IF msgPtr # NIL THEN
class := msgPtr^.class;
code := msgPtr^.code;
ReplyMsg (msgPtr);
MenuReaction
ELSE
Rechnen
END
END RespondMessage;
BEGIN
OpenNewWindow(wP,180,100,40,5,FlagSet{close,drag,depth},
'R E C H N E R');
Assert(wP#NIL,ADR('Cannot Open Rechner'));
ModifyIDCMP(wP,wP^.idcmpFlags+IDCMPFlagSet{menuPick});
SetClear(wP,FALSE);
IF NOT GetLongValue('m',oldm) THEN
oldm:=MaxLongReal
END;
Init;
IF InitTasMenu() THEN
REPEAT
IF (fehler=0) AND inputOK AND (NOT oldFormel) THEN
Assign(alteFormel,formel);
formel[0]:=0C
END;
IF oldFormel THEN
Assign(formel,alteFormel);
oldFormel:=FALSE
END;
ReadString(wP,':',formel,39);
RespondMessage;
UNTIL ende;
ELSE
Error(ADR('InitTasMenu'),ADR('Error'))
END;
CleanupTas;
END Tas;
BEGIN
TermProcedure(CleanupTas);
wP:=NIL;
END Calcu.mod